package com.chuxing.security.handler;

import cn.dev33.satoken.exception.NotLoginException;
import com.chuxing.domain.Result;
import com.chuxing.exception.GenericException;
import com.chuxing.exception.UnauthorizedException;
import com.mysql.cj.jdbc.exceptions.CommunicationsException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.resource.NoResourceFoundException;

/**
 * @author LiuQi
 * @create 2024-11-06-下午4:13
 */

/**
 * 全局异常处理器，处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 全局异常处理器方法
     * 该方法用于捕获全局范围内的异常，并返回统一的错误响应结果
     *
     * @param e 异常对象，包含捕获到的异常信息
     * @return 返回SaResult对象，包含错误信息
     */
    @ExceptionHandler
    public Result exceptionHandler(Exception e){
        // 记录异常信息到日志，便于问题追踪和定位
        log.error("异常信息：{}", e.getMessage());
        e.printStackTrace();
        // 返回错误信息给客户端，告知用户请求处理失败的原因
        return Result.error(500,"数据异常，请重试！！！");
    }

    @ExceptionHandler
    public Result unauthorizedExceptionHandler(UnauthorizedException e){
        // 记录异常信息到日志，便于问题追踪和定位
        log.info("异常信息：{}", e.getMessage());
        // 返回错误信息给客户端，告知用户请求处理失败的原因
        return Result.error(401,e.getMessage());
    }

    @ExceptionHandler
    public Result notLoginExceptionHandler(NotLoginException e){
        // 记录异常信息到日志，便于问题追踪和定位
        log.info("异常信息：{}", "未登录");
        // 返回错误信息给客户端，告知用户请求处理失败的原因
        return Result.error(401,"未登录");
    }

    @ExceptionHandler
    public Result genericExceptionHandler(GenericException e){
        // 记录异常信息到日志，便于问题追踪和定位
        log.info("异常信息：{}", e.getMessage());
        // 返回错误信息给客户端，告知用户请求处理失败的原因
        return Result.error(0,e.getMessage());
    }

    @ExceptionHandler
    public Result noHandlerFoundExceptionHandler(NoHandlerFoundException e){
        // 记录异常信息到日志，便于问题追踪和定位
        //输出不存在的路径
        log.error("请求路径不存在：{}", e.getRequestURL());
        // 返回错误信息给客户端，告知用户请求处理失败的原因
        return Result.error(404,"请求的路径不存在");
    }

    @ExceptionHandler
    public Result nullPointerExceptionHandler(NoResourceFoundException e){
        // 记录异常信息到日志，便于问题追踪和定位
        log.error("请求的资源不存在：{}", e.getResourcePath());
        // 返回错误信息给客户端，告知用户请求处理失败的原因
        return Result.error(404,"请求的资源不存在");
    }

    @ExceptionHandler
    public Result communicationExceptionHandler(CommunicationsException e){
        // 记录异常信息到日志，便于问题追踪和定位
        log.error("数据库连接异常：{}", e.getMessage());
        // 返回错误信息给客户端，告知用户请求处理失败的原因
        return Result.error(500,"网络异常，请重试！！！");
    }
}
